package main

import (
    "fmt"
    "math"
    "sort"
)

/*
   ============================作业一：圆形、三角形、长方形求面积==============================
*/
// 定义接口
type Area interface{ area() float64 }

// 定义结构体
type Roundness struct{ r float64 }
type Triangle struct{ bottom, height float64 }
type Rectangle struct{ length, width float64 }

// 构造函数
func NewRoundness(r float64) *Roundness {
    rount := new(Roundness)
    rount.r = r
    return rount
}
func NewTriangle(bottom, height float64) *Triangle {
    triangle := new(Triangle)
    triangle.bottom = bottom
    triangle.height = height
    return triangle
}
func NewRectangle(length, width float64) *Rectangle {
    rectangle := new(Rectangle)
    rectangle.length = length
    rectangle.width = width
    return rectangle
}

// 圆形求面积方法
func (c *Roundness) area() float64 {
    return c.r * c.r * math.Pi
}

// 三角形求面积方法
func (c *Triangle) area() float64 {
    return (c.bottom * c.height) / 2
}

// 矩形求面积方法
func (c *Rectangle) area() float64 {
    return c.length * c.width
}

func main() {
    // 圆形
    round := NewRoundness(5.2)
    var a Area = round
    fmt.Printf("圆形面积为：%.1f\n", a.area())

    // 三角形
    triangle := NewTriangle(3.2, 62)
    var t Area = triangle
    fmt.Printf("三角形面积为：%g\n", t.area())
    //矩形
    rectangle := NewRectangle(5.2, 32)
    var r Area = rectangle
    fmt.Printf("矩形面积为：%g\n", r.area())

    /*
       =======作业二：利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列========
    */
    slices := []Area{
        a, t, r,
    }
    sort.Slice(slices, func(i, j int) bool {
        return slices[i].area() > slices[j].area()
    })
    for i, v := range slices {
        fmt.Printf("降序排序第%d为: %.2f\n", i+1, v.area())
    }

}

// 阿飞老师的批改
// 思路比较清晰，代码逻辑都正确，但是golang里使用构造函数没有太大必要。
